package com.atguigu.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @version 1.0
 * @Author 马冰
 * @Date 2024/12/17 21:32
 * @注释
 */
public class ProxyFactory {

    //设置需要代理的目标对象
    private Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }
    public Object getProxy() {
        /**
         * ClassLoader loader:加载动态生成的代理类的类加载器
         * Class<?>[] interfaces:目标对象实现的所有的接口的Class对象的数组
         * InvocationHandler h:设置代理对象如何重写接口中的方法
         */
        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler h = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //proxy:代理对象,method:要重写的方法,args:方法的参数
                Object result;
                try {
                    System.out.println("方法名："+method.getName()+"，参数："+ Arrays.toString(args));
                    result = method.invoke(target, args);
                    System.out.println("方法名："+method.getName()+"，结果："+ result);
                } catch (Exception e) {
                    System.out.println("方法名："+method.getName()+"，异常："+ e);
                    throw new RuntimeException(e);
                } finally {
                    System.out.println("方法名："+method.getName()+"，方法执行完毕");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,h);
    }
}
